package com.wlb365.financing.modules.esign.service;

import cn.hutool.core.util.PageUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.wlb365.financing.common.utils.SdkHelper;
import com.wlb365.financing.modules.esign.request.seals.CreateImageReq;
import com.wlb365.financing.modules.esign.request.seals.CreateOfficialTemplateReq;
import com.wlb365.financing.modules.esign.request.seals.CreatePersonalTemplateReq;
import com.wlb365.financing.modules.esign.request.seals.DefaultSealReq;
import com.wlb365.financing.modules.esign.request.seals.DeleteSealReq;
import com.wlb365.financing.modules.esign.request.seals.QuerySealsPageReq;
import com.wlb365.financing.modules.esign.response.seals.CreateSealsRes;
import com.wlb365.financing.modules.esign.response.seals.QuerySealsPageRes;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 概述：印章服务类
 * </p>
 *
 * @author zwh
 * @version 1.0
 * @copyRight 北京微利宝信息技术有限公司  All right reserved.
 * @date 2021/5/27
 */
@Slf4j
@Service
public class SealsService {
    /**
     * 创建个人印章.
     * @param accountId 个人账号【必填】
     * @param type 印章类型【必填】，BORDERLESS-无边框矩形印章；RECTANGLE-带边框矩形印章；SQUARE-正方形印章
     *             正方形印章（SQUARE）支持长度为 2-4或7-9或14-16 个字符的姓名，其他印章样式支持长度为2-18个字符的姓名
     * @param alias 别名【可空】
     * @param color 印章颜色【可空】，RED-红色；BLUE-蓝色；BLACK-黑色
     * @param height 高度【可空】，默认95px
     * @param width 宽度【可空】，默认95px
     * @author zwh
     * @return CreateSealsRes 结果.
     **/
    public CreateSealsRes personalTemplate(String accountId, String type, String alias, String color, Integer height, Integer width){
        CreatePersonalTemplateReq req = new CreatePersonalTemplateReq();
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("type", type);
        param.put("alias", alias);
        param.put("color", color);
        param.put("height", height);
        param.put("width", width);
        req.setBizModel(param);

        return SdkHelper.executeAndCheck(req);
    }

    /**
     * 创建机构印章.
     * @param accountId 机购账号【必填】
     * @param type 印章类型【必填】，BORDERLESS-无边框矩形印章；RECTANGLE-带边框矩形印章；SQUARE-正方形印章
     *             正方形印章（SQUARE）支持长度为 2-4或7-9或14-16 个字符的姓名，其他印章样式支持长度为2-18个字符的姓名
     * @param central 中心图案类型【必填】，STAR-圆形有五角星；NONE-圆形无五角星
     * @param alias 别名【可空】
     * @param color 印章颜色【可空】，RED-红色；BLUE-蓝色；BLACK-黑色
     * @param height 高度【可空】，默认159px
     * @param width 宽度【可空】，默认159px
     * @param htext 横向文【可空】，可设置0-8个字，企业名称超出25个字后，不支持设置横向文
     * @param qtext 下弦文【可空】，可设置0-20个字，企业企业名称超出25个字后，不支持设置下弦文
     * @author zwh
     * @return CreateSealsResult 结果.
     **/
    public CreateSealsRes createOfficialTemplate(String accountId, String type, String central, String alias, String color, Integer height, Integer width, String htext, String qtext){
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("type", type);
        param.put("central", central);
        param.put("alias", alias);
        param.put("color", color);
        param.put("height", height);
        param.put("width", width);
        param.put("htext", htext);
        param.put("qtext", qtext);
        CreateOfficialTemplateReq req = new CreateOfficialTemplateReq();
        req.setBizModel(param);
        return SdkHelper.executeAndCheck(req);
    }

    /**
     * 创建个人或机构图片印章.
     * @param accountId 个人账号或机构账号【必填】
     * @param type 印章类型【必填】，印章数据类型，BASE64：base64格式
     * @param data 印章数据【必填】
     * @param alias 别名【可空】
     * @param transparentFlag ，是否对图片进行透明化处理【可空】，默认false。对于有背景颜色的图片，建议进行透明化处理，否则可能会遮挡文字
     * @param height 印章高度【可空】, 个人默认95px, 机构默认159px
     * @param width 印章高度【可空】, 个人默认95px, 机构默认159px
     * @author zwh
     * @return CreatePersonalTemplateResult 结果.
     **/
    public CreateSealsRes image(String accountId, String type, String data, String alias, Boolean transparentFlag, Integer height, Integer width){
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("type", type);
        param.put("data", data);
        param.put("alias", alias);
        param.put("transparentFlag", transparentFlag);
        param.put("height", height);
        param.put("width", width);
        CreateImageReq req = new CreateImageReq();
        req.setBizModel(param);
        return SdkHelper.executeAndCheck(req);
    }

    /**
     * 分页查询个人或机构印章列表.
     * @param type 0-个人，1-机构【必填】
     * @param accountId 个人账号或机构账号【必填】
     * @param current 页码【必填】
     * @param size 条数【必填】
     * @author zwh
     * @return QuerySealsPageResult 结果.
     **/
    public QuerySealsPageRes page(String type, String accountId, Integer current, Integer size){
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("offset", PageUtil.getStart(current, size));
        param.put("size", size);
        QuerySealsPageReq req;
        if ("0".equals(type)) {
            req = new QuerySealsPageReq("esign.seals.query-personal-page");
        } else {
            req = new QuerySealsPageReq("esign.seals.query-official-page");
        }
        req.setBizModel(param);
        return SdkHelper.executeAndCheck(req);
    }

    /**
     * 删除印章.
     * @param type 0-个人，1-机构【必填】
     * @param accountId 个人账号或机构账号【必填】
     * @param sealId 印章ID【必填】
     * @author zwh
     **/
    public void delete(String type, String accountId, String sealId){
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("sealId", sealId);
        DeleteSealReq req;
        if ("0".equals(type)) {
            req = new DeleteSealReq("esign.seals.delete-personal-template");
        } else {
            req = new DeleteSealReq("esign.seals.delete-official-template");
        }
        req.setBizModel(param);
        SdkHelper.executeAndCheck(req);
    }

    /**
     * 设置默认印章.
     * @param type 0-个人，1-机构【必填】
     * @param accountId 个人账号或机构账号【必填】
     * @param sealId 印章ID【必填】
     * @author zwh
     **/
    public void defaultSeal(String type, String accountId, String sealId){
        Map<String, Object> param = Maps.newHashMap();
        param.put("accountId", accountId);
        param.put("sealId", sealId);
        DefaultSealReq req;
        if ("0".equals(type)) {
            req = new DefaultSealReq("esign.seals.default-personal-template");
        } else {
            req = new DefaultSealReq("esign.seals.default-official-template");
        }
        req.setBizModel(param);
        SdkHelper.executeAndCheck(req);
    }

}
